import { EventEmitter } from 'node:events';

const emitter = new EventEmitter();

// emitter.on('error', (err) => {
//   console.log('error 自定义事件触发了');

//   console.log(err);
// });

// 如果没有通过 on 注册 test-error 事件，不会报错，不会有任何反应
emitter.emit('test-error', new Error('触发一个自定义错误'));

// 如果没有通过 on 注册 error 事件， 会报错，程序崩溃
// emitter.emit('error', new Error('触发一个自定义错误'));

/**
 * emitter.on('error') 只能用来捕获同步错误
 */

const e2 = new EventEmitter();

e2.on('error', (err) => {
  console.log('错误被捕获了', err);
});

e2.on('run-test', () => {
  throw new Error('抛出一个[同步]错误');
});

// 同步错误
// try {
//   e2.emit('run-test');
// } catch (error) {
//   console.log('try----catch');

//   e2.emit('error', error);
// }

// setTimeout(() => {
//   try {
//     throw new Error('Asynchronous error');
//   } catch (err) {
//     // 异步需要手动try  catch 并手动emit触发 error事件
//     e2.emit('error', err); // 手动触发 error 事件
//   }
// }, 1000);

// 异步错误
setTimeout(() => {
  try {
    e2.emit('error', new Error('Asynchronous error'));
  } catch (err) {
    console.log('Caught async error:', err.message); // 不会被触发
  }
}, 100);

const showGlobalCase = () => {
  // 全局监听未捕获的异常
  process.on('uncaughtException', (err) => {
    console.log('全局捕获了异常');

    console.error('Global error handler:', err.message);
  });

  setTimeout(() => {
    throw new Error('Unhandled async error');
  }, 1000);
};

// showGlobalCase()
